<?php
/**
 * CRUD Abstrato com log
 * @author Emanuel Melo e Renato Lenz @ PC4 Team
 */
class PC4_Crud_Abstrato_Rastreado extends PC4_Crud_Abstrato {
	
	/**
	 * Construtor recebendo a tabela que será manipulada
	 * @param string $tabela
	 */
	function __construct($tabela) {
		parent::__construct($tabela);
	}

	/**
	 * Recebe um array com os campos e insere na base de dados o novo registro
	 * Loga o resultado
	 * @param array $umRegistro
	 * @return int/array $id inserido ou (array)$erros com mensagens de erro
	 */
	function insere($umRegistro) {
		$erros = parent::insere($umRegistro);
		if (is_numeric($erros)) {
			PC4_Util_Log::gravar('insere_' . $this->tabela, 'Cadastrado com sucesso: ' . json_encode($umRegistro));
		}
		else {
			PC4_Util_Log::gravar('insere_' . $this->tabela, 'Erro: ' . implode("<br />", $erros));
		}
		return $erros;
	}
	
	/**
	 * Recebe um array de registros e insere na base de dados
	 * Loga o resultado
	 * @param array de beans $registros
	 * @param string o nome alternativo para a chave primaria
	 * @return int/array $id inserido ou (array)$erros com mensagens de erro
	 */
	function insereVarios($registros, $nome_id = 'id') {
		$erros = parent::insereVarios($registros, $nome_id);
		if (empty($erros) || is_numeric($erros[0])) {
			PC4_Util_Log::gravar('insere_varios_' . $this->tabela, 'Cadastrado com sucesso: ' . json_encode($registros));
		}
		else {
			PC4_Util_Log::gravar('insere_varios_' . $this->tabela, 'Erro: ' . implode("<br />", $erros));
		}

		return $erros;
	}
	
	/**
	 * Edita um registro baseado no id
	 * @param array $umRegistro
	 * @param int $id
	 * @param string o nome alternativo para a chave primaria
	 * @return array $erros para cada campo que não passou da validação 
	 */
	function edita($umRegistro, $id, $nome_id = 'id') {
		$erros = parent::edita($umRegistro, $id, $nome_id);
		if (empty($erros)) {
			PC4_Util_Log::gravar('edita_' . $this->tabela, 'Registro #' . $id . ' editado com sucesso: ' . json_encode($umRegistro));
		}
		else {
			PC4_Util_Log::gravar('edita_' . $this->tabela, 'Erro no registro #' . $id . ': ' . implode("<br />", $erros));
		}
		return $erros;
	}
	
	/**
	 * Apaga um registro
	 * @param int $id
	 * @param string o nome alternativo para a chave primaria
	 * @return int linhas afetadas
	 */
	function apaga($id, $nome_id = 'id') {
		$registro = $this->consulta("$nome_id = $id");
		$affected_rows = parent::apaga($id, $nome_id);
		
		PC4_Util_Log::gravar('apaga_' . $this->tabela, 'Registro apagado com sucesso: ' . json_encode($registro));
		
		return $affected_rows;
	}

	/**
	 * Ativa e Desativa um registro
	 * @param int $id
	 * @param array $set
	 * @param string o nome alternativo para a chave primaria
	 * @return true - ativado, false - erro
	 */
	function ativaDesativa($id, $set, $nome_id = 'id') {
		$modo = array("desativado", "ativado");
		$ok = parent::ativaDesativa($id, $set, $nome_id);
		if ($ok) {
			PC4_Util_Log::gravar($modo[$set] . '_' . $this->tabela, 'Registro #' . $id . ' ' . $modo[$set] . ' com sucesso.');
		}
		else {
			PC4_Util_Log::gravar($modo[$set] . '_' . $this->tabela, "Erro: Não foram selecionados registros.");
		}	 

		return $ok;
	}
}

